# 提示：此函数应能访问 QGraphicsView 对象。
# 参考：作者的项目中，此函数在某个QMainWindow类中，作为导出按钮的槽函数。

import sys
import PyQt5.QtGui
from PyQt5.QtCore import QRectF
from PyQt5.QtWidgets import QFileDialog, QMessageBox


def slotExpMap(self):
    """将图形导出为图片保存"""
    # 注意view设置的sceneRect会遮盖scene设置的sceneRect
    # 此处要根据你的代码修改，也可能是：
    # sceneWidth = self.view.scene().sceneRect().width()
    sceneWidth = self.view.sceneRect().width()  # 场景宽度
    sceneHeight = self.view.sceneRect().height()

    # 空白图片
    img = PyQt5.QImage(int(sceneWidth), int(sceneHeight), PyQt5.QtGui.QImage.Format.Format_RGB32)

    # 将空白图片作为painter的painter device，即绘图设备
    painter = PyQt5.QPainter()
    painter.begin(img)  # 开始绘制

    # 图片等待绘制的区域
    targetRect = QRectF(0, 0, sceneWidth, sceneHeight)

    # 场景被临摹(拍照)的区域
    sourceRect = QRectF(-sceneWidth / 2, -sceneHeight / 2, sceneWidth, sceneHeight)

    # 开始渲染绘制
    self.view.scene().render(painter, targetRect, sourceRect)

    # 必须手动关闭绘制painter，原Qt(C++)由析构函数自动调用，但在Python中需手动调用
    painter.end()

    # 用户选择保存位置的对话框，返回：文件路径，文件类型
    destpath, filetype = QFileDialog.getSaveFileName(self, "文件保存", "hello.png", "图片 (*.png)")

    imgWriter = PyQt5.QImageWriter(destpath)  # 使用imgWriter更加安全，可显示错误提示
    if destpath:  # 如果获取的路径非空
        if imgWriter.write(img):
            QMessageBox.information(self, "提示", "导出成功")
        else:
            QMessageBox.information(self, "错误", imgWriter.errorString())
    else:
        QMessageBox.information(self, "提示", "未选择保存位置，文件保存操作已取消")